package es.uned.etsii.si3.taller.servlets;

import java.sql.SQLException;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import com.opensymphony.xwork2.ActionSupport;

import es.uned.etsii.si3.taller.FactoriaFunciones;
import es.uned.etsii.si3.taller.FactoriaFunciones.DescripcionFuncion;
import es.uned.etsii.si3.taller.FactoriaFunciones.FuncionDesconocida;

public class AdministracionFunciones extends ActionSupport {
	private static final long serialVersionUID = 1L;
	private Set<String> funcionesActivas = null;
	private boolean desdeElJsp = false;
	
	/* BEGIN - getters y setters */
	public Collection<DescripcionFuncion> getListaFunciones() {
		Collection<DescripcionFuncion> listaFunciones = null;
		
		try {
			listaFunciones = FactoriaFunciones.getListaFunciones();
		} catch (SQLException e) {
			addActionError("Error de SQL al intentar recuperar la lista de funciones");
		}
		
		return listaFunciones;
	}
	
	public void setFuncionesActivas(List<String> fAct) {
		funcionesActivas = new HashSet<String>(fAct);
	}
	
	public void setDesdeElJsp(boolean t) {
		desdeElJsp = true;
	}
	/* END - getters y setters */
	
	public String display() {
		return NONE;
	}

	/**
	 * Función que permite activar y desactivar funcionalidades de la aplicación
	 */
	public String execute() {
		if (!desdeElJsp) {
			addActionError("Acceso incorrecto");
			return NONE;
		}
		// Todas las funciones desactivadas
		if (funcionesActivas == null) {
			funcionesActivas = new HashSet<String>();
		}
		
		Collection<DescripcionFuncion> listaFunciones = getListaFunciones();
		
		if (listaFunciones != null) {
			for (DescripcionFuncion funcion: listaFunciones) {
				String identificador = funcion.getIdentificador();
				
				try {
					if (funcionesActivas.contains(identificador)) {
						FactoriaFunciones.setEstaActiva(identificador, true);
						funcionesActivas.remove(identificador);
					}
					else {
						FactoriaFunciones.setEstaActiva(identificador, false);
					}
				} catch (FuncionDesconocida e) {
					// TODO: No va a pasar... estamos iterando sobre la lista de funciones proporcionada por la factoría
				} catch (SQLException e) {
					addActionError("No se pudo modificar la función '" + funcion.getDescripcion() + "' en la base de datos: " + e.toString());
				}
			}
			
			if (funcionesActivas.size() > 0) {
				addActionError("Se solicitó activar funciones desconocidas: " + funcionesActivas);
			}

			if (!hasActionErrors())
				addActionMessage("Aplicados los cambios sin incidencias");
		}
		
		return NONE;
	}
}
